package cn.quevo.core.util;

import cn.quevo.core.entity.PageResult;
import cn.quevo.core.exception.PageParamsException;
import cn.quevo.core.lang.StringUtils;

/**
 * 分页初始化工具类
 *
 * @author July july_sky@foxmail.com
 * @version 1.0
 * @date 2017-11-26 14:47:01
 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
 */
public class PageUtils {

    /**
     * 获取一个空白Page对象
     *
     * @return
     * @author July july_sky@foxmail.com
     * @date 2017年11月14日 下午7:01:58
     */
    public static <T> PageResult<T> getPageResult() {
        return new PageResult<>();
    }

    /**
     * 获取一个包含错误信息的Page对象
     *
     * @return
     * @author July july_sky@foxmail.com
     * @date 2017年11月14日 下午7:02:18
     */
    public static <T> PageResult<T> getPageResult(String error) {
        PageResult<T> result = new PageResult<>();
        result.setMsg(error);
        return result;
    }

    /**
     * 重新计算分页
     *
     * @author July july_sky@foxmail.com
     * @date 2017/11/24 下午6:44
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static <T> void pagination(PageResult<T> pageResult) throws PageParamsException {
        // 验证单页记录条数是否超出最大数
        if (pageResult.getPageSize() >= PageResult.maxSize || pageResult.getPageSize() <= 0) {
            throw new PageParamsException();
        }
        // 计算总页数
        long countPage = pageResult.getTotal() / pageResult.getPageSize() + (pageResult.getTotal() % pageResult.getPageSize() == 0 ? 0 : 1);
        // 验证当前页数是否正确
        pageResult.setCurPage(pageResult.getCurPage()>countPage?Double.valueOf(countPage).intValue():pageResult.getCurPage());

        // 设置信息从第几条记录开始
        pageResult.setFirst(pageResult.getPageSize() * (pageResult.getCurPage() - 1) + 1L);
        pageResult.setFirst(pageResult.getFirst()>pageResult.getTotal()?pageResult.getTotal():pageResult.getFirst());
        pageResult.setLast(pageResult.getCurPage().longValue() == countPage ? pageResult.getTotal() : pageResult.getFirst() + pageResult.getPageSize());
        pageResult.setCountPage(Long.valueOf(countPage).intValue());
        pageResult.setMore(StringUtils.valueOf(pageResult.getCurPage().intValue() < countPage));
    }
}
